// https://www.metools.info/code/aes275.html
const CryptoJS = require('./crypto-js')
const signature = require('./signature')

/**
 * AES加解密
 * data：加密的内容，可以是对象
 * key：秘钥。要求是8位或者16位等倍数位才可解密
 * iv：偏移量。CBC模式需偏移量
 * mode：加密方式
 * 	ECB、CBC、CTR、OFB、CFB
 * padding：填充方式
 * 	pkcs7paddinng
 * 	pkcs5paddinng
 *  zeropadding
 * 	iso10126
 *  iso97971
 * 	ansix923
 * 'no padding'
 */
const getAesString = (data, key, iv, mode = 'ECB', padding = 'Pkcs7') => { //加密
	var keys = CryptoJS.enc.Utf8.parse(key)
	var iv = CryptoJS.enc.Utf8.parse(iv)
	var encrypt = CryptoJS.AES.encrypt(data, keys, {
		iv, //iv偏移量 CBC需加偏移量
		mode: CryptoJS.mode[mode],
		padding: CryptoJS.pad[padding]
	})
	return encrypt.toString()
 }
const getDAesString = (data, key, iv, mode = 'ECB', padding = 'Pkcs7') => { // 解密
	var keys = CryptoJS.enc.Utf8.parse(key)
	var iv = CryptoJS.enc.Utf8.parse(iv)
	var decrypt = CryptoJS.AES.decrypt(data, keys, {
		iv,
		mode: CryptoJS.mode[mode],
		padding: CryptoJS.pad[padding]
	})
	return CryptoJS.enc.Utf8.stringify(decrypt).toString()
 }

 // AES 对称秘钥加密 加密的结果会越来越长
const aes = {
	en: (data, params = {}) => {
	   if (typeof(params) === 'object') {

	   } else {
		   params = {key: params}
	   }
	   return getAesString(data, params.key, params.iv, params.mode, params.padding)
	},
	de: (data, params = {}) => {
	   if (typeof(params) === 'object') {
	   		
	   } else {
		   params = {key: params}
	   }
	   return getDAesString(data, params.key, params.iv, params.mode, params.padding)
	}
}
 
// BASE64 加密的结果会越来越长
const base64 = {
	en: (data) => CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data)),
	de: (data) => CryptoJS.enc.Base64.parse(data).toString(CryptoJS.enc.Utf8)
}

// SHA256 64位
const sha256 = (data) => {
	return CryptoJS.SHA256(data).toString()
}

 // MD5 32位
const md5 = (data) => {
	if (typeof(data) === 'object') {
		data = JSON.stringify(data)
	} else if (typeof(data) !== 'string') {
		data += ''
	}
	if (typeof(data) === 'string') {
		return CryptoJS.MD5(data).toString()
	}
	return '请传入字符串'
}

/**
 * 密码加密
 */
const setPassword = (password, type) => {
	switch (type){
		case 1: // base64
			return base64.en(password)
		case 2: // SHA256
			return sha256(password)
		case 3: // AES
			return aes.en(password, 'capfer0102030405')
		case 4: // MD5
			return md5(password + 'capfer0102030405')
		default:
			return password
	}
}

/**
 * 密码解密
 */
const getPassword = (password, type) => {
	switch (type){
		case 1: // base64
			return base64.de(password)
		case 2: // SHA256
			return password
		case 3: // AES
			return aes.de(password, 'capfer0102030405')
		case 4: // MD5
			return password
		default:
			return password
	}
}
 
 /**
  * 常用的加解密方式
  */
module.exports = {
	aes, 
	md5, 
	sha256, 
	base64,
	/**
	 * 通过CryptoJS对象有其它多种SHA的方式
	 */
	/**
	 * 通过CryptoJS对象有其它多种SHA的方式
	 * 在小程序上一定报错！！！
	 */
	// #ifndef MP-WEIXIN
	CryptoJS,
	// #endif
	
	// 密码加密
	setPassword,
	// 密码解密
	getPassword,
	
	// 签名工具
	signature
}